﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace DataAccessComponents
{
    public class Termin : INotifyPropertyChanged,IDataErrorInfo
    {
        /// <summary>
        /// Id termin 
        /// </summary>
        private int id_termin;

        public int Id_termin
        {
            get { return this.id_termin; }
            set { this.id_termin = value; NotifyPropertyChanged("Id_termin"); }
        }

        /// <summary>
        /// Id oferty
        /// </summary>
        private int id_oferta;

        public int Id_oferta
        {
            get { return this.id_oferta; }
            set { this.id_oferta = value; NotifyPropertyChanged("Id_oferta"); }
        }

        /// <summary>
        /// Obiekt oferta
        /// </summary>
        private Oferta oferta;

        public Oferta Oferta
        {
            get { return oferta; }
            set { oferta = value; NotifyPropertyChanged("Oferta"); }
        }

        /// <summary>
        /// Data rozpoczęcia terminu
        /// </summary>
        private DateTime data_rozpoczecia;

        public DateTime Data_rozpoczecia
        {
            get { return this.data_rozpoczecia; }
            set { this.data_rozpoczecia = value; czy_zmiana = true; NotifyPropertyChanged("Data_rozpoczecia"); }
        }

        /// <summary>
        /// Data zakonczenia terminu
        /// </summary>
        private DateTime data_zakonczenia;

        public DateTime Data_zakonczenia
        {
            get { return data_zakonczenia; }
            set { data_zakonczenia = value; czy_zmiana = true; NotifyPropertyChanged("Data_zakonczenia"); }
        }

        /// <summary>
        /// Ilosc dni trwania oferty
        /// </summary>
        private int ilosc_dni;

        public int Ilosc_dni
        {
            get { return ilosc_dni; }
            set { ilosc_dni = value; czy_zmiana = true; NotifyPropertyChanged("Ilosc_dni"); }
        }

        /// <summary>
        /// Cena oferty w danym terminie
        /// </summary>
        private Decimal cena;

        public Decimal Cena
        {
            get { return cena; }
            set { cena = value; czy_zmiana = true; NotifyPropertyChanged("Cena"); }
        }

        /// <summary>
        /// Id miasta wylotu
        /// </summary>
        private int id_miasta_wylotu;

        public int Id_miasta_wylotu
        {
            get { return id_miasta_wylotu; }
            set { id_miasta_wylotu = value; czy_zmiana = true; NotifyPropertyChanged("Id_miasta_wylotu"); }
        }

        /// <summary>
        /// Id miasta docelowego
        /// </summary>
        private int id_miasta_celu;

        public int Id_miasta_celu
        {
            get { return id_miasta_celu; }
            set { id_miasta_celu = value; czy_zmiana = true; NotifyPropertyChanged("Id_miasta_celu"); }
        }

        /// <summary>
        /// Godzina wylotu z celu
        /// </summary>
        private DateTime godzina_wylotu_z_celu;

        public DateTime Godzina_wylotu_z_celu
        {
            get { return godzina_wylotu_z_celu; }
            set { godzina_wylotu_z_celu = value; czy_zmiana = true; NotifyPropertyChanged("Godzina_wylotu_z_celu"); }
        }

        /// <summary>
        /// Godzina wylotu
        /// </summary>
        private DateTime godzina_wylotu;

        public DateTime Godzina_wylotu
        {
            get { return godzina_wylotu; }
            set { godzina_wylotu = value; czy_zmiana = true; NotifyPropertyChanged("Godzina_wylotu"); }
        }

        /// <summary>
        /// Czas lotu
        /// </summary>
        private float czas_lotu;

        public float Czas_lotu
        {
            get { return czas_lotu; }
            set { czas_lotu = value; czy_zmiana = true; NotifyPropertyChanged("Czas_lotu"); }
        }

        /// <summary>
        /// Gdy nastopiła zmiana w obiekcie do to na true
        /// </summary>
        private bool czy_zmiana;

        public bool Czy_zmiana
        {
            get { return czy_zmiana; }
            set { czy_zmiana = value; }
        }


        /// <summary>
        /// Konstruktor tworzący obiekt
        /// </summary>
        /// <param name="idt">Id termin</param>
        /// <param name="ido">Id oferta</param>
        /// <param name="oferta">Oferta</param>
        /// <param name="dr">Data rozpoczecia</param>
        /// <param name="id">Ilosc dni</param>
        /// <param name="c">Cena</param>
        /// <param name="idmw">Id miasta wylotu</param>
        /// <param name="idmc">Id miasta celu</param>
        /// <param name="gwzc">Godzina wylotu z celu</param>
        /// <param name="gw">Godzina wylotu</param>
        /// <param name="czl">Czas lotu</param>
        /// <param name="dz">Data zakonczenia</param>
        public Termin(int idt, int ido, Oferta oferta,DateTime dr, int id, Decimal c, int idmw, int idmc, DateTime gwzc, DateTime gw, float czl,DateTime dz)
        {
            this.id_termin = idt;
            this.id_oferta = ido;
            this.data_rozpoczecia = dr;
            this.ilosc_dni = id;
            this.cena = c;
            this.id_miasta_wylotu = idmw;
            this.id_miasta_celu = idmc;
            this.godzina_wylotu_z_celu = gwzc;
            this.godzina_wylotu = gw;
            this.czas_lotu = czl;
            this.data_zakonczenia = dz;
            this.oferta = oferta;
        }
        public Termin()
            : this(0, 0,new Oferta(),DateTime.Today, 0, 0, 0, 0, DateTime.Now, DateTime.Now, 0,DateTime.Today)
        {
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region Private Helpers
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            }
        }
        #endregion

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string propertyName]
        {
            get {
                string result = string.Empty;
                propertyName = propertyName ?? string.Empty;

                if (propertyName == "Ilosc_dni")
                {
                    if (this.Ilosc_dni < 0)
                    {
                        result = "Pole \"Ilosc_dni\" nie może zawierać wartości ponieżej zera";
                    }
                }
                else if (propertyName == "Cena")
                {
                    if (this.Cena < 0)
                    {
                        result = "Pole \"Cena\" nie może zawierać wartości ponieżej zera";
                    }
                }
                else if (propertyName == "Czas_lotu")
                {
                    if (this.Czas_lotu < 0)
                    {
                        result = "Pole \"Czas_lotu\" nie może zawierać wartości ponieżej zera";
                    }
                }
                else if (propertyName == "Data_zakonczenia")
                {
                    if (this.Data_zakonczenia < this.Data_rozpoczecia)
                    {
                        result = "Data zakończenia niemoże być wcześniejsza niż data rozpoczęcia";
                    }
                }

                return result;
            }
        }
    }
}
